﻿<!DOCTYPE html>
<html>
<head>
	<title>各种循环比较</title>
</head>
<body>
	<script type="text/javascript">
		var chars = '0123456789abcdef';

		function getRandomString() {
			var len = Math.ceil(Math.random() * 7) + 3; // 4-10
			var result = "";
			while (len--) {
				result += chars.charAt(Math.floor(Math.random() * chars.length));
			}
			return result;
		}

		var size = 10000;
		var mult = 100;

		var ary = [];
		var lsize = size;
		while (lsize--) { ary.push('' + getRandomString() + ''); }

		function for_in() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/;
			for (var i in ary) {
				var item = i;
				if (isInt.test(item)) { item += 1; }
			}
		}

		function for_normal() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/;
			for (var i = 0, len = ary.length; i < len; i++) {
				var item = ary[i];
				if (isInt.test(item)) { item += 1; }
			}
		}

		function for_reverse() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/;
			for (var i = ary.length; i--; ) {
				var item = ary[i];
				if (isInt.test(item)) { item += 1; }
			}
		}

		function while_normal() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/,
					i = 0,
					l = ary.length;
			while (i < l) {
				var item = ary[i++];
				if (isInt.test(item)) { item += 1; }
			}
		}

		function while_reverse() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/,
					i = ary.length;
			while (i--) {
				var item = ary[i];
				if (isInt.test(item)) { item += 1; }
			}
		}

		function do_while_normal() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/,
					i = 0,
					l = ary.length;
			do {
				var item = ary[i++];
				if (isInt.test(item)) { item += 1; }
			} while (i < l)
		}

		function do_while_reverse() {
			var isInt = /(^[0-9]$)|(^[1-9][0-9]+$)/,
					i = ary.length - 1;
			do {
				var item = ary[i];
				if (isInt.test(item)) { item += 1; }
			} while (i--)
		}

		console.log('数组长度：' + ary.length);
		console.log('Profiling will begin in 2 seconds...');
		setTimeout(function () {
			var currTime;
			for (var k = 0; k < 3; k++) {
				console.log('第' + (k + 1) + '次循环测试：')
				currTime = new Date();
				console.profile();
				for (var i = 0; i < mult; i++) {
					//for_in();
					for_normal();
					for_reverse();
					while_normal();
					while_reverse();
					do_while_normal();
					do_while_reverse();
				}
				console.profileEnd();
				console.log('用时：' + (new Date() - currTime) + 'ms');
			}
		}, 2000);

		/**
		* 优先考虑使用while、do-while循环
		*
		* continue、break语句：最好用在for循环中
		*
		* 如果i在循环体内只有一次调用，优先有while循环，如果多次调用然后再i++，就是用for循环
		*
		* 执行continue语句时,封闭循环的当前迭代就会被终止,开始执行下一次迭代.这对不同类型的循环语句含义是不同的:
		*		(1)在while循环中,会再次检测循环开头的expression,如果它的值为true,将从头开始执行循环体.
		*		(2)在do/while循环中,会跳到循环的底部,在顶部开始下次循环前,会在此先检测循环条件.但是,在Javascrīpt 1.2中有一个bug,它使continue语句直接跳转到do/while语句的顶部,而无需检测循环条件.因此,如果你打算在循环中使用 continue语句,就应该避免使用do/while循环,除非你可以确定自己用户的浏览器绝对没有bug.但是这个问题并不严重,因为总有一个等价的 while循环可以用来替换do/while循环.
		*		(3)在for循环中,先计算increment表达式,然后再检测test表达式以确定是否应该执行下一次迭代.
		*		(4)在for/in循环中,将以下一个赋给循环变量的属性名再次开始新的迭代.
		* 
		* 注意while循环和for continue语句的行为的不同之处.
		* 
		* 在while循环中,它直接跳转到循环条件处.而在for循环中则要先计算increment表达试,然后再跳转到循环条件处,所以用一个while循环来完全模拟一个for循环是不可能的.
		**/

	</script>
</body>
</html>
